package ninth.利用Callable接口实现多线程;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class 启动多线程 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //实例化多线程对象
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();
        FutureTask<String> task1 = new FutureTask<String>(mt1);
        FutureTask<String> task2 = new FutureTask<String>(mt2);
        //FutureTask是Runnable接口子类，所以可以使用Thread类的构造方法来接收task对象
        new Thread(task1).start();//启动第一个线程
        new Thread(task2).start();//启动第二个线程
        //多线程执行完毕可以去的内容，依靠FutureTask的父接口Future中的get()方法实现
        System.out.println("A线程返回的结果："+task1.get());
        System.out.println("B线程返回的结果："+task2.get());
    }
}
/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=53114:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 ninth.利用Callable接口实现多线程.启动多线程
卖票：ticket=5
卖票：ticket=4
卖票：ticket=3
卖票：ticket=5
卖票：ticket=2
卖票：ticket=4
卖票：ticket=3
卖票：ticket=2
卖票：ticket=1
卖票：ticket=1
A线程返回的结果：票都卖完了！
B线程返回的结果：票都卖完了！

Process finished with exit code 0
 */
/**
 * 上面的程序将Callable接口的子类利FutureTask类实现包装。由于FUtureTaks是Runnable接口的子类，所以可以利用Thread类的start()方法来启动多线程。
 * 当线程执行完毕时，可以用Future接口中的get()方法来返回线程的执行结果
 *
 * 如果实现多线程，建议使用Runnable接口完成
 * 通过Callable接口与Runnable接口实现的比较，读者可以发现，Callable接口只是胜在了有返回值上。但是Runnable接口是Java最早提供的，也是使用最广泛的接口，
 * 所以在进行多线程实现时还是优先考虑使用Runnable接口
 */